package com.ssd.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssd.api.payment.dto.enums.TradingStateEnum;
import com.ssd.constant.Constants;
import com.ssd.mapper.TradingMapper;
import com.ssd.model.domain.Trading;
import com.ssd.service.BasicPayService;
import com.ssd.service.TradingService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * 交易订单表 服务实现类
 */
@Service
public class TradingServiceImpl extends ServiceImpl<TradingMapper, Trading> implements TradingService {
    // 注入基础支付服务
    @Resource
    private BasicPayService basicPayService;

    /**
     * 根据交易订单号查找交易记录
     *
     * @param tradingOrderNo 交易订单号
     * @return 对应的交易记录，如果不存在则返回null
     */
    @Override
    public Trading findTradByTradingOrderNo(Long tradingOrderNo) {
        // 创建查询条件包装器
//        LambdaQueryWrapper<Trading> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，根据交易订单号查询
//        queryWrapper.eq(Trading::getTradingOrderNo, tradingOrderNo);
        // 执行查询并返回结果
//        Trading one = super.getOne(queryWrapper);
        Trading one = lambdaQuery()
                .eq(Trading::getTradingOrderNo, tradingOrderNo)
                .one();
        return one;
    }

    /**
     * 根据交易状态查找交易记录
     *
     * @param tradingState 交易状态枚举
     * @param count        限制返回的记录数量，最多10条
     * @return 符合状态的交易记录列表
     */
    @Override
    public List<Trading> findListByTradingState(TradingStateEnum tradingState, Integer count) {
        // 限制查询数量，最多为10条记录
        count = NumberUtil.max(count, 10);
        // 创建查询条件
        LambdaQueryWrapper<Trading> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件：交易状态等于传入的交易状态枚举
        queryWrapper.eq(Trading::getTradingState, tradingState)
                // 设置查询条件：记录为有效状态
                .eq(Trading::getEnableFlag, Constants.YES)
                // 设置排序方式：按创建时间升序排序
                .orderByAsc(Trading::getCreateTime)
                // 设置查询数量限制
                .last("LIMIT " + count);
        // 执行查询并返回结果
        return list(queryWrapper);
    }

    /**
     * 根据订单id和支付方式查询付款中的交易单
     *
     * @param productOrderNo 订单号
     * @param tradingChannel 支付渠道代码
     * @return 交易单
     */
    @Override
    public Trading queryDuringTrading(String productAppId,Long productOrderNo, String tradingChannel){
        // 创建查询条件构造器
        LambdaQueryWrapper<Trading> queryWrapper = new LambdaQueryWrapper<>();
        // 等值查询业务系统订单号
        queryWrapper.eq(Trading::getProductOrderNo, productOrderNo)
                // 等值查询业务系统应用标识
                .eq(Trading::getProductAppId,productAppId)
                // 等值查询交易单状态为付款中
                .eq(Trading::getTradingState, TradingStateEnum.FKZ)
                // 等值查询支付渠道
                .eq(Trading::getTradingChannel, tradingChannel);
        // 执行查询并获取结果列表
        List<Trading> list = list(queryWrapper);
        // 获取列表中的第一个交易对象
        Trading trading = CollectionUtil.getFirst(list);
        // 返回交易对象
        return trading;
    }

    /**
     * 根据订单id查询交易单
     *
     * @param productAppId 应用ID，用于区分不同的应用
     * @param productOrderNo 订单号
     * @return 交易单列表
     */
    @Override
    public List<Trading> queryByProductOrder(String productAppId,Long productOrderNo){
        // 创建查询条件构造器
        LambdaQueryWrapper<Trading> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，根据订单号和应用ID查询
        queryWrapper.eq(Trading::getProductOrderNo, productOrderNo)
                .eq(Trading::getProductAppId, productAppId);
        // 执行查询并返回结果
        return list(queryWrapper);
    }

    /**
     * 根据订单id查询已付款的交易单
     *
     * @param productAppId 应用id，用于区分不同的应用
     * @param productOrderNo 订单id
     * @return 交易单
     */
    @Override
    public Trading findFinishedTrading(String productAppId,Long productOrderNo){
        // 创建查询条件构造器
        LambdaQueryWrapper<Trading> queryWrapper = new LambdaQueryWrapper<>();
        // 设置查询条件，包括订单号、应用id和交易状态为已付款
        queryWrapper.eq(Trading::getProductOrderNo, productOrderNo)
                .eq(Trading::getProductAppId,productAppId)
                .eq(Trading::getTradingState,TradingStateEnum.YJS);
        // 执行查询并获取结果列表
        List<Trading> list = list(queryWrapper);
        // 获取列表中的第一个元素，即匹配的交易单
        Trading first = CollectionUtil.getFirst(list);
        // 返回交易单对象
        return first;
    }
}

